//package com.guass.nettyprotostuff.rpc.client;
//
//import com.guass.nettyprotostuff.rpc.MsgDecoder;
//import com.guass.nettyprotostuff.rpc.MsgEncoder;
//import com.guass.nettyprotostuff.rpc.common.ModelMsg;
//import com.guass.nettyprotostuff.rpc.common.TypeData;
//import io.netty.bootstrap.Bootstrap;
//import io.netty.buffer.ByteBuf;
//import io.netty.buffer.Unpooled;
//import io.netty.channel.*;
//import io.netty.channel.nio.NioEventLoopGroup;
//import io.netty.channel.socket.nio.NioSocketChannel;
//import io.netty.handler.codec.DelimiterBasedFrameDecoder;
//import io.netty.handler.timeout.IdleStateHandler;
//import io.netty.util.concurrent.Future;
//import io.netty.util.concurrent.GenericFutureListener;
//import lombok.extern.slf4j.Slf4j;
//
//
//import java.util.Scanner;
//import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.TimeUnit;
//
//@Slf4j
//public class Client {
//
//    private Bootstrap bootstrap;
//    private Channel channel;
////    protected String serverIp = "139.9.29.23";
//    protected String serverIp = "127.0.0.1";
//    private int port = 8888;
//
//    public void start(){
//
//        NioEventLoopGroup group = new NioEventLoopGroup();
//
//        NettyClientHandler nettyClientHandler = new NettyClientHandler(Client.this);
//
//        bootstrap = new Bootstrap();
//        bootstrap.group(group)
//                .channel(NioSocketChannel.class)
//                .option(ChannelOption.SO_KEEPALIVE,true)
//                .option(ChannelOption.TCP_NODELAY,true)
//                .handler(new ChannelInitializer<Channel>() {
//                    @Override
//                    protected void initChannel(Channel channel) throws Exception {
//                        ByteBuf byteBuf = Unpooled.copiedBuffer(TypeData.DELIMITER.getBytes());
//
//                        channel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,byteBuf))
//                                .addLast(new MsgDecoder())
//                                .addLast(new MsgEncoder())
//                                .addLast( new IdleStateHandler(0, 0, 30, TimeUnit.SECONDS))
//                                .addLast(nettyClientHandler);
//                    }
//                });
//
//        doConnect();
//
//    }
//
//    public void startTest(final int num,final int beginPort, int nPort){
//
//        NioEventLoopGroup group = new NioEventLoopGroup();
//
//        NettyClientHandler nettyClientHandler = new NettyClientHandler(this);
//
//        bootstrap = new Bootstrap();
//        bootstrap.group(group)
//                .channel(NioSocketChannel.class)
//                .option(ChannelOption.SO_KEEPALIVE,true)
//                .option(ChannelOption.TCP_NODELAY,true)
//                .handler(new ChannelInitializer<Channel>() {
//                    @Override
//                    protected void initChannel(Channel channel) throws Exception {
//                        ByteBuf byteBuf = Unpooled.copiedBuffer(TypeData.DELIMITER.getBytes());
//
//                        channel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,byteBuf))
//                                .addLast(new MsgDecoder())
//                                .addLast(new MsgEncoder())
//                                .addLast( new IdleStateHandler(0, 0, 30, TimeUnit.SECONDS))
//                                .addLast(nettyClientHandler);
//                    }
//                });
//
//        doConnectTest(num, beginPort, nPort,  bootstrap);
//
//    }
//
//    protected void doConnectTest(final int num,final int beginPort, int nPort, Bootstrap bootstrap) {
//
//        for (int i = 0; i < num; i++) {
//            int connectPort = beginPort + i % (nPort - beginPort);
//            extracted(connectPort);
//        }
//    }
//
//    private void extracted(int connectPort) {
//        log.info("guass test ===> {},{}",serverIp, connectPort);
//        ChannelFuture channelFuture = bootstrap.connect(serverIp, connectPort);
//
//        //实现监听通道连接的方法
//        channelFuture.addListener((ChannelFutureListener) channelFuture1 -> {
//            if(channelFuture1.isSuccess()){
//                Channel channel = channelFuture1.channel();
////                sendData(channelFuture1.channel());
//            }else{
//                log.info("每隔2s重连....");
//                channelFuture1.channel().eventLoop().schedule(() -> {
//                    // TODO Auto-generated method stub
//                    extracted(connectPort);
//
//                },2, TimeUnit.SECONDS);
//            }
//        });
//    }
//
//    /**
//     * 连接服务端 and 重连
//     */
//    protected void doConnect() {
//
//        if (channel != null && channel.isActive()){
//            return;
//        }
//
//        ChannelFuture channelFuture = bootstrap.connect(serverIp, port);
//
//        //实现监听通道连接的方法
//        channelFuture.addListener((ChannelFutureListener) channelFuture1 -> {
//
//            if(channelFuture1.isSuccess()){
//                channel = channelFuture1.channel();
//                sendData(channel);
//            }else{
//                log.info("每隔2s重连....");
//                channelFuture1.channel().eventLoop().schedule(() -> {
//                    // TODO Auto-generated method stub
//                    doConnect();
//                },2, TimeUnit.SECONDS);
//            }
//        });
//    }
//
//    /**
//     * 向服务端发送消息
//     */
//    private void sendData(Channel channel) {
//        CompletableFuture.runAsync(()->{
//            while (true){
//                Scanner sc= new Scanner(System.in);
//                if(channel != null && channel.isActive()){
//                    //获取一个键盘扫描器
//                    String nextLine = sc.nextLine();
//                    ModelMsg model = new ModelMsg();
//                    model.setMessageType(TypeData.CUSTOMER);
//                    model.setBody(nextLine);
//                    ChannelFuture future = channel.writeAndFlush(model);
//
//                    future.addListener((ChannelFutureListener) channelFuture -> {
//                        System.out.println("channelFuture.isSuccess() = " + channelFuture.isSuccess());
//                        System.out.println("channelFuture.channel().id().asShortText() = " + channelFuture.channel().id().asShortText());
//
//                    });
//                }
//            }
//        });
//    }
//
//
//    public static void main(String[] args) {
//      new Client().start();
//    }
//}
